This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(lme4)
library(ggplot2)
library(plotrix)
library(visreg)
library(stringr)
library(dplyr)
output_data <- data.frame(read.csv("/Users/noa/Workspace/lasso_positions_sampling_results/brlen_only_lasso_final.csv",header = TRUE, na.strings = ""))
print(output_data)
NA
NA
print( output_data[output_data$lasso_test_R.2<0.5,c("n_seq","n_loci","sample_pct","lasso_test_R.2", "lasso_training_R.2", "lasso_training_spearmanr","number_loci_chosen")])

library(e1071)

data_exp = output_data[output_data$brlen_generator=="exponential",]
data_optimized = output_data[output_data$brlen_generator=="optimized",]
data_uniform = output_data[output_data$brlen_generator=="uniform",]
data_800 = output_data[output_data$actucal_training_size ==800,]

Q.25<- function(vec)
{
  return(unname(quantile(vec,probs=0.25)))
}

example_data  = output_data[output_data$dataset_id=="/groups/pupko/noaeker/data/ABC_DR/Selectome/Euteleostomi/ENSGT00600000084481/ref_msa.aa.phy",]


output_data %>% 
group_by(actucal_training_size,brlen_generator ) %>%
  summarise(across(.cols=c(lasso_test_R.2,lasso_test_spearmanr,number_loci_chosen), .fns= list(Median=median,Mean=mean,Min=min,Max=max,Skw=skewness), na.rm= TRUE))
`summarise()` regrouping output by 'actucal_training_size' (override with `.groups` argument)
output_data %>% 
group_by(brlen_generator ) %>%
  summarise(across(.cols=c(lasso_test_R.2,lasso_test_spearmanr,number_loci_chosen), .fns= list(Median=median,Mean=mean,Min=min,Max=max), na.rm= TRUE))
`summarise()` ungrouping output (override with `.groups` argument)
output_data_no_outliers = output_data[output_data$lasso_test_R.2>0.5,]

 ggplot(output_data_no_outliers, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=lasso_test_R.2))+ 
     geom_boxplot()+
    labs(title="Lasso test set pearson R squared vs. training size")+xlab("Training size")+ylab("Lasso test R squared")+
  theme(plot.title = element_text(hjust = 0.5)) + labs(color = "Branch length distribution")

 
 
  ggplot(data_800, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=lasso_test_R.2))+ 
     geom_boxplot()+
    labs(title="Lasso test set pearson R squared for training size 800")+xlab("Training size")+ ylab("Lasso test R squared")+ labs(color = "Branch length distribution")

  theme(plot.title = element_text(hjust = 0.5)) 
List of 1
 $ plot.title:List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0.5
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi FALSE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi FALSE
 - attr(*, "validate")= logi TRUE
  
    ggplot(data_800, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=number_loci_chosen))+ 
     geom_boxplot()+
    labs(title="Number of positions chosen by Lasso for training size 800")+xlab("Training size")+ ylab("Number of positions chosen by Lasso")+ labs(color = "Branch length distribution")

  theme(plot.title = element_text(hjust = 0.5)) 
List of 1
 $ plot.title:List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0.5
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi FALSE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi FALSE
 - attr(*, "validate")= logi TRUE
 
  
 
  
  
output_data_no_outliers %>%
  ggplot( aes(x=lasso_test_R.2, color=brlen_generator, fill = brlen_generator)) +
    geom_histogram( alpha=0.6, position = 'identity',bins=150) 

  
  

 ggplot(output_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=lasso_test_spearmanr**2))+
     geom_boxplot()+
   labs(title="Lasso test set spearman R squared vs. training size")+xlab("Training size")+ 
  theme(plot.title = element_text(hjust = 0.5)) + labs(color = "Branch length distribution")


ggplot(output_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=number_loci_chosen ))+
    geom_boxplot()+
   labs(title="Number of positions chosen by Lasso vs. training size")+xlab("Training size")+ ylab("Number of positions chosen by Lasso")

  theme(plot.title = element_text(hjust = 0.5)) + labs(color = "Branch length distribution")
List of 2
 $ plot.title:List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0.5
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi FALSE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ colour    : chr "Branch length distribution"
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi FALSE
 - attr(*, "validate")= logi TRUE
linear.mod = lm((output_data$lasso_test_mse)~(as.factor(output_data$brlen_generator)+as.factor(output_data$actucal_training_size)+output_data$mad+output_data$n_loci
                +output_data$avg_entropy))
print(summary(linear.mod))

Call:
lm(formula = (output_data$lasso_test_mse) ~ (as.factor(output_data$brlen_generator) + 
    as.factor(output_data$actucal_training_size) + output_data$mad + 
    output_data$n_loci + output_data$avg_entropy))

Residuals:
   Min     1Q Median     3Q    Max 
-41834  -4801   -186   3617 535247 

Coefficients:
                                                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)                                     -2.528e+04  5.902e+03  -4.284 2.08e-05 ***
as.factor(output_data$brlen_generator)optimized -5.619e+03  2.037e+03  -2.759  0.00594 ** 
as.factor(output_data$brlen_generator)uniform   -3.639e+03  2.037e+03  -1.787  0.07441 .  
as.factor(output_data$actucal_training_size)100 -1.088e+04  2.629e+03  -4.138 3.91e-05 ***
as.factor(output_data$actucal_training_size)200 -1.302e+04  2.629e+03  -4.951 9.14e-07 ***
as.factor(output_data$actucal_training_size)400 -1.359e+04  2.629e+03  -5.168 3.04e-07 ***
as.factor(output_data$actucal_training_size)800 -1.375e+04  2.629e+03  -5.228 2.23e-07 ***
output_data$mad                                  3.161e+04  1.503e+04   2.103  0.03578 *  
output_data$n_loci                               8.859e+00  8.843e-01  10.018  < 2e-16 ***
output_data$avg_entropy                          2.835e+04  6.560e+03   4.322 1.76e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22770 on 740 degrees of freedom
Multiple R-squared:  0.1815,    Adjusted R-squared:  0.1716 
F-statistic: 18.24 on 9 and 740 DF,  p-value: < 2.2e-16
plot(output_data$lasso_test_R.2,resid(linear.mod))
abline(0,0)

example_data %>%
  ggplot( aes(x=lasso_test_R.2, color=brlen_generator, fill = brlen_generator)) +
    geom_histogram( alpha=0.6, position = 'identity',bins=15) 


 ggplot(example_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=lasso_test_R.2))+ 
     geom_point(size=3)+
    labs(title="Lasso test set R squared vs. training size",color = "Branch length distribution")+xlab("Training size")+ylab("Lasso test R squared")+

theme(plot.title = element_text(hjust = 0.5)) 
 

ggplot(example_data, aes(x=as.factor(actucal_training_size),color=brlen_generator, y=number_loci_chosen ))+
    geom_point(size=3)+
   labs(title="Number of positions chosen by Lasso vs. training size",color = "Branch length distribution")+xlab("Training size")+ ylab("Number of positions chosen by Lasso")
  theme(plot.title = element_text(hjust = 0.5)) 
  
#ggplot(output_data, aes(x=brlen_generator, y=output_data$ll_pearson_during_tree_search, fill=as.factor(actucal_training_size))) + 
#    geom_boxplot()

#data_exp = output_data[output_data$brlen_generator=="exponential",]
#data_optimized = output_data[output_data$brlen_generator=="optimized",]
#data_uniform = output_data[output_data$brlen_generator=="uniform",]

#ggplot(data_exp, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+ 
#    geom_boxplot()


#ggplot(data_optimized, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+ 
 #   geom_boxplot()


#ggplot(data_uniform, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search))+ 
#    geom_boxplot()

ggplot(output_data, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search**2, shape=brlen_generator, color=brlen_generator)) +
  geom_point(size=3)+labs(title="Pearson R^2 during tree search vs training size")+xlab("training size")+
  theme(plot.title = element_text(hjust = 0.5))


ggplot(output_data, aes(x=as.factor(actucal_training_size), y=ll_spearman_during_tree_search**2, shape=brlen_generator, color=brlen_generator)) +
  geom_point(size=3)+labs(title="Spearman R^2 during tree search vs training size")+xlab("training size")+
  theme(plot.title = element_text(hjust = 0.5))

#ggplot(data_exp, aes(x=as.factor(actucal_training_size), y=ll_pearson_during_tree_search)) +
#  geom_point(size=3)+labs(title="Pearson during tree search vs training size- exponential")+xlab("training size")+
#  theme(plot.title = element_text(hjust = 0.5))
#ggplot(data_optimized, aes(x=as.factor(actucal_training_size), y=lasso_test_R.2)) +
#  geom_point(size=3)+labs(title=title)+xlab(x.axis.name)
#ggplot(data_uniform, aes(x=as.factor(actucal_training_size), y=lasso_test_R.2)) +
#  geom_point(size=3)+labs(title=title)+xlab(x.axis.name)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0KbGlicmFyeShsbWU0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeSh2aXNyZWcpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShkcGx5cikKb3V0cHV0X2RhdGEgPC0gZGF0YS5mcmFtZShyZWFkLmNzdigiL1VzZXJzL25vYS9Xb3Jrc3BhY2UvbGFzc29fcG9zaXRpb25zX3NhbXBsaW5nX3Jlc3VsdHMvYnJsZW5fb25seV9sYXNzb19maW5hbC5jc3YiLGhlYWRlciA9IFRSVUUsIG5hLnN0cmluZ3MgPSAiIikpCnByaW50KG91dHB1dF9kYXRhKQoKCmBgYApgYGB7cn0KcHJpbnQoIG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGxhc3NvX3Rlc3RfUi4yPDAuNSxjKCJuX3NlcSIsIm5fbG9jaSIsInNhbXBsZV9wY3QiLCJsYXNzb190ZXN0X1IuMiIsICJsYXNzb190cmFpbmluZ19SLjIiLCAibGFzc29fdHJhaW5pbmdfc3BlYXJtYW5yIiwibnVtYmVyX2xvY2lfY2hvc2VuIildKQpgYGAKCgpgYGB7cn0KCmxpYnJhcnkoZTEwNzEpCgpkYXRhX2V4cCA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGJybGVuX2dlbmVyYXRvcj09ImV4cG9uZW50aWFsIixdCmRhdGFfb3B0aW1pemVkID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0ib3B0aW1pemVkIixdCmRhdGFfdW5pZm9ybSA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGJybGVuX2dlbmVyYXRvcj09InVuaWZvcm0iLF0KZGF0YV84MDAgPSBvdXRwdXRfZGF0YVtvdXRwdXRfZGF0YSRhY3R1Y2FsX3RyYWluaW5nX3NpemUgPT04MDAsXQoKUS4yNTwtIGZ1bmN0aW9uKHZlYykKewogIHJldHVybih1bm5hbWUocXVhbnRpbGUodmVjLHByb2JzPTAuMjUpKSkKfQoKZXhhbXBsZV9kYXRhICA9IG91dHB1dF9kYXRhW291dHB1dF9kYXRhJGRhdGFzZXRfaWQ9PSIvZ3JvdXBzL3B1cGtvL25vYWVrZXIvZGF0YS9BQkNfRFIvU2VsZWN0b21lL0V1dGVsZW9zdG9taS9FTlNHVDAwNjAwMDAwMDg0NDgxL3JlZl9tc2EuYWEucGh5IixdCgoKb3V0cHV0X2RhdGEgJT4lIApncm91cF9ieShhY3R1Y2FsX3RyYWluaW5nX3NpemUsYnJsZW5fZ2VuZXJhdG9yICkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyguY29scz1jKGxhc3NvX3Rlc3RfUi4yLGxhc3NvX3Rlc3Rfc3BlYXJtYW5yLG51bWJlcl9sb2NpX2Nob3NlbiksIC5mbnM9IGxpc3QoTWVkaWFuPW1lZGlhbixNZWFuPW1lYW4sTWluPW1pbixNYXg9bWF4LFNrdz1za2V3bmVzcyksIG5hLnJtPSBUUlVFKSkKCm91dHB1dF9kYXRhICU+JSAKZ3JvdXBfYnkoYnJsZW5fZ2VuZXJhdG9yICkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyguY29scz1jKGxhc3NvX3Rlc3RfUi4yLGxhc3NvX3Rlc3Rfc3BlYXJtYW5yLG51bWJlcl9sb2NpX2Nob3NlbiksIC5mbnM9IGxpc3QoTWVkaWFuPW1lZGlhbixNZWFuPW1lYW4sTWluPW1pbixNYXg9bWF4KSwgbmEucm09IFRSVUUpKQoKCm91dHB1dF9kYXRhX25vX291dGxpZXJzID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkbGFzc29fdGVzdF9SLjI+MC41LF0KCiBnZ3Bsb3Qob3V0cHV0X2RhdGFfbm9fb3V0bGllcnMsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1sYXNzb190ZXN0X1IuMikpKyAKICAgICBnZW9tX2JveHBsb3QoKSsKICAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IHBlYXJzb24gUiBzcXVhcmVkIHZzLiB0cmFpbmluZyBzaXplIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpK3lsYWIoIkxhc3NvIHRlc3QgUiBzcXVhcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgbGFicyhjb2xvciA9ICJCcmFuY2ggbGVuZ3RoIGRpc3RyaWJ1dGlvbiIpCiAKIAogIGdncGxvdChkYXRhXzgwMCwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3RfUi4yKSkrIAogICAgIGdlb21fYm94cGxvdCgpKwogICAgbGFicyh0aXRsZT0iTGFzc28gdGVzdCBzZXQgcGVhcnNvbiBSIHNxdWFyZWQgZm9yIHRyYWluaW5nIHNpemUgODAwIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpKyB5bGFiKCJMYXNzbyB0ZXN0IFIgc3F1YXJlZCIpKyBsYWJzKGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgCiAgCiAgICBnZ3Bsb3QoZGF0YV84MDAsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1udW1iZXJfbG9jaV9jaG9zZW4pKSsgCiAgICAgZ2VvbV9ib3hwbG90KCkrCiAgICBsYWJzKHRpdGxlPSJOdW1iZXIgb2YgcG9zaXRpb25zIGNob3NlbiBieSBMYXNzbyBmb3IgdHJhaW5pbmcgc2l6ZSA4MDAiKSt4bGFiKCJUcmFpbmluZyBzaXplIikrIHlsYWIoIk51bWJlciBvZiBwb3NpdGlvbnMgY2hvc2VuIGJ5IExhc3NvIikrIGxhYnMoY29sb3IgPSAiQnJhbmNoIGxlbmd0aCBkaXN0cmlidXRpb24iKQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSAKIAogIAogCgogIAoKIGdncGxvdChvdXRwdXRfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3Rfc3BlYXJtYW5yKioyKSkrCiAgICAgZ2VvbV9ib3hwbG90KCkrCiAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IHNwZWFybWFuIFIgc3F1YXJlZCB2cy4gdHJhaW5pbmcgc2l6ZSIpK3hsYWIoIlRyYWluaW5nIHNpemUiKSsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgbGFicyhjb2xvciA9ICJCcmFuY2ggbGVuZ3RoIGRpc3RyaWJ1dGlvbiIpCgpnZ3Bsb3Qob3V0cHV0X2RhdGEsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLGNvbG9yPWJybGVuX2dlbmVyYXRvciwgeT1udW1iZXJfbG9jaV9jaG9zZW4gKSkrCiAgICBnZW9tX2JveHBsb3QoKSsKICAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHBvc2l0aW9ucyBjaG9zZW4gYnkgTGFzc28gdnMuIHRyYWluaW5nIHNpemUiKSt4bGFiKCJUcmFpbmluZyBzaXplIikrIHlsYWIoIk51bWJlciBvZiBwb3NpdGlvbnMgY2hvc2VuIGJ5IExhc3NvIikKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBsYWJzKGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikKCgoKCgoKCgoKCgoKCgoKCmBgYAoKYGBge3J9CmxpbmVhci5tb2QgPSBsbSgob3V0cHV0X2RhdGEkbGFzc29fdGVzdF9tc2Upfihhcy5mYWN0b3Iob3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yKSthcy5mYWN0b3Iob3V0cHV0X2RhdGEkYWN0dWNhbF90cmFpbmluZ19zaXplKStvdXRwdXRfZGF0YSRtYWQrb3V0cHV0X2RhdGEkbl9sb2NpCiAgICAgICAgICAgICAgICArb3V0cHV0X2RhdGEkYXZnX2VudHJvcHkpKQpwcmludChzdW1tYXJ5KGxpbmVhci5tb2QpKQpwbG90KG91dHB1dF9kYXRhJGxhc3NvX3Rlc3RfUi4yLHJlc2lkKGxpbmVhci5tb2QpKQphYmxpbmUoMCwwKQpgYGAKCgpgYGB7cn0KZXhhbXBsZV9kYXRhICU+JQogIGdncGxvdCggYWVzKHg9bGFzc29fdGVzdF9SLjIsIGNvbG9yPWJybGVuX2dlbmVyYXRvciwgZmlsbCA9IGJybGVuX2dlbmVyYXRvcikpICsKICAgIGdlb21faGlzdG9ncmFtKCBhbHBoYT0wLjYsIHBvc2l0aW9uID0gJ2lkZW50aXR5JyxiaW5zPTE1KSAKCgogZ2dwbG90KGV4YW1wbGVfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PWxhc3NvX3Rlc3RfUi4yKSkrIAogICAgIGdlb21fcG9pbnQoc2l6ZT0zKSsKICAgIGxhYnModGl0bGU9Ikxhc3NvIHRlc3Qgc2V0IFIgc3F1YXJlZCB2cy4gdHJhaW5pbmcgc2l6ZSIsY29sb3IgPSAiQnJhbmNoIGxlbmd0aCBkaXN0cmlidXRpb24iKSt4bGFiKCJUcmFpbmluZyBzaXplIikreWxhYigiTGFzc28gdGVzdCBSIHNxdWFyZWQiKSsKCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSAKIAoKZ2dwbG90KGV4YW1wbGVfZGF0YSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksY29sb3I9YnJsZW5fZ2VuZXJhdG9yLCB5PW51bWJlcl9sb2NpX2Nob3NlbiApKSsKICAgIGdlb21fcG9pbnQoc2l6ZT0zKSsKICAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHBvc2l0aW9ucyBjaG9zZW4gYnkgTGFzc28gdnMuIHRyYWluaW5nIHNpemUiLGNvbG9yID0gIkJyYW5jaCBsZW5ndGggZGlzdHJpYnV0aW9uIikreGxhYigiVHJhaW5pbmcgc2l6ZSIpKyB5bGFiKCJOdW1iZXIgb2YgcG9zaXRpb25zIGNob3NlbiBieSBMYXNzbyIpCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpIAogIApgYGAKCgpgYGB7cn0KI2dncGxvdChvdXRwdXRfZGF0YSwgYWVzKHg9YnJsZW5fZ2VuZXJhdG9yLCB5PW91dHB1dF9kYXRhJGxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoLCBmaWxsPWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpKSkgKyAKIyAgICBnZW9tX2JveHBsb3QoKQoKI2RhdGFfZXhwID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0iZXhwb25lbnRpYWwiLF0KI2RhdGFfb3B0aW1pemVkID0gb3V0cHV0X2RhdGFbb3V0cHV0X2RhdGEkYnJsZW5fZ2VuZXJhdG9yPT0ib3B0aW1pemVkIixdCiNkYXRhX3VuaWZvcm0gPSBvdXRwdXRfZGF0YVtvdXRwdXRfZGF0YSRicmxlbl9nZW5lcmF0b3I9PSJ1bmlmb3JtIixdCgojZ2dwbG90KGRhdGFfZXhwLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9wZWFyc29uX2R1cmluZ190cmVlX3NlYXJjaCkpKyAKIyAgICBnZW9tX2JveHBsb3QoKQoKCiNnZ3Bsb3QoZGF0YV9vcHRpbWl6ZWQsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKSkrIAogIyAgIGdlb21fYm94cGxvdCgpCgoKI2dncGxvdChkYXRhX3VuaWZvcm0sIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKSkrIAojICAgIGdlb21fYm94cGxvdCgpCgpnZ3Bsb3Qob3V0cHV0X2RhdGEsIGFlcyh4PWFzLmZhY3RvcihhY3R1Y2FsX3RyYWluaW5nX3NpemUpLCB5PWxsX3BlYXJzb25fZHVyaW5nX3RyZWVfc2VhcmNoKioyLCBzaGFwZT1icmxlbl9nZW5lcmF0b3IsIGNvbG9yPWJybGVuX2dlbmVyYXRvcikpICsKICBnZW9tX3BvaW50KHNpemU9MykrbGFicyh0aXRsZT0iUGVhcnNvbiBSXjIgZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUiKSt4bGFiKCJ0cmFpbmluZyBzaXplIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKZ2dwbG90KG91dHB1dF9kYXRhLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9zcGVhcm1hbl9kdXJpbmdfdHJlZV9zZWFyY2gqKjIsIHNoYXBlPWJybGVuX2dlbmVyYXRvciwgY29sb3I9YnJsZW5fZ2VuZXJhdG9yKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPSJTcGVhcm1hbiBSXjIgZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUiKSt4bGFiKCJ0cmFpbmluZyBzaXplIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgojZ2dwbG90KGRhdGFfZXhwLCBhZXMoeD1hcy5mYWN0b3IoYWN0dWNhbF90cmFpbmluZ19zaXplKSwgeT1sbF9wZWFyc29uX2R1cmluZ190cmVlX3NlYXJjaCkpICsKIyAgZ2VvbV9wb2ludChzaXplPTMpK2xhYnModGl0bGU9IlBlYXJzb24gZHVyaW5nIHRyZWUgc2VhcmNoIHZzIHRyYWluaW5nIHNpemUtIGV4cG9uZW50aWFsIikreGxhYigidHJhaW5pbmcgc2l6ZSIpKwojICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKI2dncGxvdChkYXRhX29wdGltaXplZCwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksIHk9bGFzc29fdGVzdF9SLjIpKSArCiMgIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPXRpdGxlKSt4bGFiKHguYXhpcy5uYW1lKQojZ2dwbG90KGRhdGFfdW5pZm9ybSwgYWVzKHg9YXMuZmFjdG9yKGFjdHVjYWxfdHJhaW5pbmdfc2l6ZSksIHk9bGFzc29fdGVzdF9SLjIpKSArCiMgIGdlb21fcG9pbnQoc2l6ZT0zKStsYWJzKHRpdGxlPXRpdGxlKSt4bGFiKHguYXhpcy5uYW1lKQoKYGBgCgoKCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCg==